package modele;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;


public class XMLParser {

	static final String xmlPath = "donnees.xml";
	private Element racine;
	private Element batiments;
	private Element personnes;
	private Element journal;
	
	public XMLParser()
	{
		this.ouvreFichierXML();
	}
	
	/**
	 * <h1>ouvreFichierXML</h1>
	 * 
	 * Permet d'ouvrir le fichier XML des donnees
	 */
	
	private void ouvreFichierXML()
	{
		SAXBuilder sxb = new SAXBuilder();
		try {
			try {
				this.racine = sxb.build(new File(XMLParser.xmlPath)).getRootElement();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		} catch (JDOMException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * <h1>getPersonnes</h1>
	 * 
	 * Permet de parser toutes les personnes sous formes d'instance de Personne
	 * @return listPersonnes une arraylist de Personne
	 */
	
	public ArrayList<Personne> getPersonnes()
	{
		ArrayList<Personne> listPersonnes = new ArrayList<Personne>();
		ArrayList<Batiment> listBatiments = this.getBatiments();
		
		this.personnes=this.racine.getChild("personnes");
		
		/**
		 * Boucle sur toutes les personnes comprisent dans le fichier XML
		 */
		for(Element e :this.personnes.getChildren())
		{
			/**
			 * Récupère les attributs de la personne
			 */
			String nom = e.getChild("nom").getTextTrim();
			String prenom = e.getChild("prenom").getTextTrim();
			String id = e.getChild("id").getTextTrim();
			ArrayList<Batiment> listBatimentsBadge = new ArrayList<Batiment>();
			
			/**
			 * Boucle sur les batiments d'un badge
			 */
			for(Element batimentBadge :e.getChild("badge").getChild("batiments").getChildren())
			{
				/**
				 * Boucle sur les batiment et check leurs Id dans la liste des batiments du badge
				 */
				for(Batiment batiment :listBatiments)
				{				
					if(batimentBadge.getTextTrim().equals(batiment.getID()))
					{
						listBatimentsBadge.add(batiment);
					}
				}
			}
			/**
			 * Créer le badge avec la liste de batiment que l'on vient de créer
			 */
			
			Badge badge = new Badge(id,listBatimentsBadge);
			listPersonnes.add(new Personne(nom,prenom,id, badge));
			}
		return listPersonnes;
	}
	
	
	
	
	/**
	 * <h1>getBatiments</h1>
	 * 
	 * Permet de parser tous les batiments sous formes d'instance de Batiment
	 * @return listBatiments une arraylist de Batiment
	 */
	
	public ArrayList<Batiment> getBatiments()
	{
		ArrayList<Batiment> listBatiments = new ArrayList<Batiment>();
		this.batiments=this.racine.getChild("batiments");
				
		for(Element e :this.batiments.getChildren())
		{
			String nom = e.getChild("nom").getTextTrim();
			String ID = e.getChild("id").getTextTrim();
			listBatiments.add(new Batiment(nom, ID));
		}
		return listBatiments;
	}
	
	/**
	 * <h1>getAcces</h1>
	 * 
	 * Permet de parser tous les acces sous formes d'instance d'Acces
	 * @return listAcces une arraylist d'Acces
	 */	
	public ArrayList<Acces> getAcces() {
		
		ArrayList<Acces> listAcces = new ArrayList<Acces>();
		this.journal=this.racine.getChild("journal");
			
		for(Element e :this.journal.getChildren())
		{
			String id = e.getChild("id").getTextTrim();
			String batiment = e.getChild("batiment").getTextTrim();
			String type = e.getChild("type").getTextTrim();
			String date = e.getChild("date").getTextTrim();
			ArrayList<Personne> listP = this.getPersonnes();
			ArrayList<Batiment> listBat = this.getBatiments();
			Personne tempPers = null;
			Batiment tempBat = null;
			
			for(Personne p1 : listP)
			{
				if(p1.getID().equals(id))
				{
					tempPers = p1;
				}
			}
			
			for(Batiment b1 : listBat)
			{
				if(b1.getID().equals(batiment))
				{
					tempBat = b1;
				}
			}
			//System.out.println("Affichage lors du parssage : "+tempPers+tempBat+type+date);
			
			if(tempPers!=null&&tempBat!=null)//Si l'ID ne correspond pas ! on peut avoir une personne non liée
			{
				listAcces.add(new Acces(tempPers, tempBat, type, date));
			}
		}
	return listAcces; 
	}
				
	public static void main(String[] args) 
	{

		XMLParser xml = new XMLParser();
		
		System.out.println("Acces aux salles : ");
		ArrayList<Acces> acces = xml.getAcces();
		for(Acces acs : acces)
		{
			System.out.println(acs);
		}
		
		/*
		System.out.println("\nPersonnes du systeme : ");
		ArrayList<Personne> personnes = xml.getPersonnes();
		for(Personne p : personnes)
		{
			System.out.println(p);
		}	
		*/
	}
}
